<?php
	/* Moteur */

	error_reporting(E_ALL ^ E_NOTICE);

	require_once(realpath(dirname(__FILE__)) . "/../classes/CacheBase.class.php");
	require_once(realpath(dirname(__FILE__)) . "/../classes/Navigation.class.php");

	require_once(realpath(dirname(__FILE__)) . "/../classes/actions/ActionsModules.class.php");

	require_once(realpath(dirname(__FILE__)) . "/../classes/filtres/Filtres.class.php");

	/* Inclusions nécessaires avant ouverture de la session */
	$modules = ActionsModules::instance()->lister(false, true);

	foreach($modules as $module) {
		try {
			$path = ActionsModules::instance()->lire_chemin_module($module->nom) . "/inclure_session.php";

			if (file_exists($path)) {
				include_once($path);
			}
		} catch (Exception $e) {}
	}

	session_start();

	header("Content-type: text/html; charset=utf-8");

	require_once(realpath(dirname(__FILE__)) . "/../fonctions/boucles.php");
	require_once(realpath(dirname(__FILE__)) . "/../fonctions/substitutions.php");
	require_once(realpath(dirname(__FILE__)) . "/../fonctions/action.php");
	require_once(realpath(dirname(__FILE__)) . "/../fonctions/divers.php");

	ActionsModules::instance()->appel_module("predemarrage"); // ajout 1.4.3

	require_once(realpath(dirname(__FILE__)) . "/../classes/Parseur.class.php");
	require_once(realpath(dirname(__FILE__)) . "/../classes/Client.class.php");
	require_once(realpath(dirname(__FILE__)) . "/../classes/Commande.class.php");
	require_once(realpath(dirname(__FILE__)) . "/../classes/Venteprod.class.php");
	require_once(realpath(dirname(__FILE__)) . "/../classes/Ventedeclidisp.class.php");
    require_once(realpath(dirname(__FILE__)) . "/../classes/Message.class.php");
	require_once(realpath(dirname(__FILE__)) . "/../classes/Messagedesc.class.php");
	require_once(realpath(dirname(__FILE__)) . "/../classes/Transzone.class.php");
	require_once(realpath(dirname(__FILE__)) . "/../classes/Variable.class.php");
	require_once(realpath(dirname(__FILE__)) . "/../classes/Promo.class.php");
	require_once(realpath(dirname(__FILE__)) . "/../classes/Promoutil.class.php");
	require_once(realpath(dirname(__FILE__)) . "/../classes/Perso.class.php");
	require_once(realpath(dirname(__FILE__)) . "/../classes/PluginsClassiques.class.php");
	require_once(realpath(dirname(__FILE__)) . "/../classes/Mail.class.php");
	require_once(realpath(dirname(__FILE__)) . "/../classes/Reecriture.class.php");
	require_once(realpath(dirname(__FILE__)) . "/../fonctions/lire.php");

	// initialisation des variables du couple php/html
	if(!isset($res)) $res="";
	if(!isset($lang)) $lang="";
	if(!isset($devise)) $devise="";
	if(!isset($securise)) $securise=0;
	if(!isset($panier)) $panier=0;
	if(!isset($nopageret)) $nopageret=0;
	if(!isset($reset)) $reset=0;
	if(!isset($transport)) $transport=0;
	if(!isset($obligetelfixe)) $obligetelfixe=0;
	if(!isset($obligetelport)) $obligetelport=0;
	if(!isset($reptpl) && !isset($fond)) $reptpl="template/";
	if(!isset($sortie)) $sortie=true;

	// création de la session si non existante
	if(! isset($_SESSION["navig"]))
	 	$_SESSION["navig"] = new Navigation();

	// Déterminer le fond de page
	if (! isset($fond))
		$fond = lireParam('fond', 'string'); // 'string_iso_strict');
	else {
		// compatibilité ancien THELIA
		$fond = str_ireplace('.html', '', $fond);
	}

	// Par defaut, utiliser le template 'index'
	if ($fond == '') $fond = 'index';


	// Définition de la langue courante
	if (empty($lang)) {
		if (isset($_REQUEST['lang']))
			$lang = lireParam('lang', 'int');
		else if (isset($_SESSION['navig']->lang))
			$lang = $_SESSION['navig']->lang;
		else
			$lang = 1;
    }

	// Définition de la devise courante
	if (empty($devise)) {
		if (isset($_REQUEST['devise']))
			$devise = lireParam('devise', 'int');
		else if (isset($_SESSION['navig']->devise))
			$devise = $_SESSION['navig']->devise;
		else
			$devise = 1;
    }


	// Les autres paramètres présents dans les URL
	$vars = array(
		'action'			=> "string",
		'append'			=> "int",
		'id'				=> "int",
		'id_parrain'		=> "int",
		'nouveau'			=> "int",
		'parent'			=> "int",
		'ref'				=> "string",
		'quantite'			=> "int",
		'article'			=> "int",
		'type_paiement'		=> "int",
		'code'				=> "string",
		'entreprise'		=> "string",
		'siret'				=> "string",
		'intracom'			=> "string",
		'parrain'			=> "string",
		'motdepasse1'		=> "string",
		'motdepasse2'		=> "string",
		'raison'			=> "int",
		'prenom'			=> "string",
		'libelle'			=> "string",
		'nom'				=> "string",
		'adresse1'			=> "string",
		'adresse2'			=> "string",
		'adresse3'			=> "string",
		'cpostal'			=> "string",
		'ville'				=> "string",
		'pays'				=> "int",
		'telfixe'			=> "string",
		'telport'			=> "string",
		'tel'				=> "string",
		'email1'			=> "string",
		'email2'			=> "string",
		'email'				=> "string",
		'motdepasse'		=> "string",
		'adresse'			=> "int",
		'id_rubrique'		=> "int",
		'id_dossier'		=> "int",
		'nouveaute'			=> "int",
		'promo'				=> "int",
		'stockmini'			=> "float",
		'page'				=> "int",
		'totbloc'			=> "int",
		'id_contenu'		=> "int",
		'caracdisp'			=> "int+\-",
		'reforig'			=> "string",
		'motcle'			=> "string",
		'id_produit'		=> "int",
		'classement'		=> "string",
		'prixmin'			=> "float",
		'prixmax'			=> "float",
		'id_image'			=> "int",
		'declinaison'		=> "string",
		'declidisp'			=> "int+\-",
		'declival'			=> "string",
		'declistock'		=> "float",
		'commande'			=> "string",
		'caracteristique'	=> "int+\-",
		'caracval'			=> "string",
		'url'				=> "string"
	);

	foreach ($vars as $nomvar => $typevar) {
		$$nomvar = lireParam($nomvar, $typevar);
	}

	// Compatibilité 1.4 qui intialise $append à 0 et non pas à ''
	$append = intval($append);

	$urlsite = new Variable("urlsite");

	// Chargement du contexte dans le cas d'une réécriture
	if($url != ""){

		$reecriture = new Reecriture($url);
		if(! $reecriture->actif){
			$redir = new Reecriture();
			$redir->charger_param($reecriture->fond, $reecriture->param, $reecriture->lang, 1);
			header("HTTP/1.1 301 Moved Permanently");
			header("Location: " . $urlsite->valeur . "/" . $redir->url);
			exit();
		}


		$fond = $reecriture->fond;
		switch($fond){
			case 'rubrique' : $id_rubrique=lireVarUrl("id_rubrique", $reecriture->param); break;
			case 'produit' : $id_produit=lireVarUrl("id_produit", $reecriture->param); $id_rubrique=lireVarUrl("id_rubrique", $reecriture->param); break;
			case 'dossier' : $id_dossier=lireVarUrl("id_dossier", $reecriture->param); break;
			case 'contenu' : $id_contenu=lireVarUrl("id_contenu", $reecriture->param); $id_dossier=lireVarUrl("id_dossier", $reecriture->param); break;
		}

		ActionsModules::instance()->appel_module("lireVarUrl", $reecriture);
	}

	// URL précédente
	if(isset($_SERVER['HTTP_REFERER'])) $_SESSION["navig"]->urlprec = $_SERVER['HTTP_REFERER'];

	// Langue
	$_SESSION["navig"]->lang = $lang;

	// Devise
	$_SESSION["navig"]->devise = $devise;

	// fonctions à éxecuter avant le moteur
	ActionsModules::instance()->appel_module("demarrage");

	// Actions
	switch($action){
		case 'ajouter' : ajouter($ref, $quantite, $append, $nouveau, $parent); break;
		case 'supprimer' : supprimer($article); break;
		case 'modifier' : modifier($article, $quantite); break;
		case 'connexion' : connexion($email,$motdepasse); break;
		case 'deconnexion' : deconnexion(); break;
		case 'paiement' : paiement($type_paiement); break;
		case 'transport' : transport($id); break;
		case 'creercompte' : creercompte($raison, $entreprise, $siret, $intracom, $prenom, $nom, $adresse1, $adresse2, $adresse3, $cpostal, $ville, $pays, $telfixe, $telport, $email1, $email2, $motdepasse1, $motdepasse2, $parrain); break;
		case 'modifiercompte' : modifiercompte($raison, $entreprise, $siret, $intracom, $prenom, $nom, $adresse1, $adresse2, $adresse3, $cpostal, $ville, $pays, $telfixe, $telport, $email1, $email2, $motdepasse1, $motdepasse2); break;
		case 'creerlivraison' : creerlivraison($id, $libelle, $raison, $entreprise, $prenom, $nom, $adresse1, $adresse2, $adresse3, $cpostal, $ville, $tel, $pays); break;
        case 'supprimerlivraison' : supprimerlivraison($id); break;
		case 'modifierlivraison' : modifierlivraison($id, $libelle, $raison, $entreprise, $prenom, $nom, $adresse1, $adresse2, $adresse3, $cpostal, $ville, $tel, $pays); break;
		case 'modadresse' : modadresse($adresse); break;
		case 'codepromo' : codepromo($code); break;
		case 'chmdp' : chmdp($email); break;
	}

	// fonctions à éxecuter avant ouverture du template
	ActionsModules::instance()->appel_module("pre");

	// chargement du fichier de langue (si existant)
	if (! empty($reptpl)) {
		@include_once(realpath(dirname(__FILE__)) . "/../$reptpl/lang/" .  $lang . ".php");
	}

	// chargement du squelette
	if($res == ""){

		$tpl = $reptpl . $fond;

		// $tpl doit impérativement être dans le répertoire $reptpl, ou un de ses sous répertoires.
		$path_tpl = realpath(dirname($tpl));
		$path_reptpl = realpath($reptpl);

		if (strpos($path_tpl, $path_reptpl) !== 0) {
			die("FOND Invalide: $fond");
		}

		if (!file_exists($tpl)) {
			$tpl .= ".html";

			if(!file_exists($tpl)) {
				die("Impossible d'ouvrir $fond ($tpl)");
			}
		}

		$res = file_get_contents($tpl);
	}

	// Lire les options définies dans le template
	$fondvars = array(
		 'securise',
		 'nopageret',
		 'reset',
		 'panier',
		 'transport',
		 'obligetelfixe',
		 'obligetelport'
	);

	if (preg_match_all("/#PARAM_FOND_([a-zA-Z0-9_]+)[\s]*=[\s]*([0-9]*)[\s]*/", $res, $matches, PREG_SET_ORDER)) {
		foreach($matches as $match) {
			$var = strtolower($match[1]);

			if (in_array($var, $fondvars)) {
				$$var = $match[2];

				$res = str_replace($match[0], '', $res);
			}
		}
	}

	// fonctions à éxecuter après la lecture des variables de fond
	ActionsModules::instance()->appel_module("varfond");

	// Page retour
	if($_SERVER['QUERY_STRING']) $qpt="/?"; else $qpt="";

	if(! $nopageret) $_SESSION["navig"]->urlpageret =  $urlsite->valeur . $qpt . $_SERVER['QUERY_STRING'];
	else if($_SESSION["navig"]->urlpageret=="") $_SESSION["navig"]->urlpageret = $urlsite->valeur;

	// Sécurisation
	if($securise && ! $_SESSION["navig"]->connecte) {
		redirige($urlsite->valeur ."/?fond=connexion");
	}

	// Vérif transport
	if($transport && ! $_SESSION["navig"]->commande->transport) {
		redirige($urlsite->valeur ."/?fond=commande");
	}

	// Vérif panier
	if($panier && ! $_SESSION["navig"]->panier->nbart) { redirige($urlsite->valeur); }


	$parseur = new Parseur();

	// fonctions à éxecuter avant les inclusions
	ActionsModules::instance()->appel_module("inclusion");

	// inclusion
	$res = $parseur->inclusion(explode("\n", $res));

	// inclusions des plugins
	ActionsModules::instance()->appel_module("action");

	$res = $parseur->analyse($res);

    Filtres::exec($res);

	$res = $parseur->post($res);

	// inclusions des plugins filtres
	ActionsModules::instance()->appel_module("post");

	// Résultat envoyé au navigateur
	$res = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $res);

	if ($sortie) echo $res;

	// fonctions à éxecuter apres l'affichage du template
	ActionsModules::instance()->appel_module("apres");

	// Reset de la commande
	if($reset){
            $_SESSION["navig"]->commande = new Commande();
            $_SESSION["navig"]->panier = new Panier();
			$_SESSION['navig']->promo = new Promo();
	}

?>